[Auth0]M2Mアプリの認証で発行されたトークン数の上限を超えた先に何が見えるのか知りたい
M2Mアプリの認証では、ユーザー名/パスワードやソーシャルログインなどの一般的な認証方法ではなく、Client Credentials Flowを使用するかと思います。
Auth0ではM2Mアプリの認証で発行されたトークン数の上限が決まっています。
価格ページにも記載されていました。
現在どれくらい使用しているのかは、サポートセンターのページで確認できます。
Freeプランの場合、クォータ上限は1000/月となっています。Auth0のManagement APIを使用するためのトークン発行では回数は消費されません。
外部オーディエンスを持つトークンのみがクォータにカウントされます
では実際に上限を超えてしまったときにどういう挙動をするのか気になったの試してみようと思います。
やってみる
上限が1000のFreeプランを用いて実験してみます。
APIとApplicationを作成する必要がありますが、本記事では作成方法は割愛します。
上記のようなサンプルAPIとApplicationを作成しました。
認証
APIのTESTタブを開くと、アプリケーションからトークンを取得するためのサンプルコードが記載されていますので、これを使わせてもらいます
今回はcurlを使います。
Auth0の/oauth/token
エンドポイントに、
- client_id
- client_secret
- audience
- grant_type
のJSONデータをPOSTすればトークンが返ってきます。
curl --request POST \ --url https://<<Auth0_Domain>>/oauth/token \ --header 'content-type: application/json' \ --data '{"client_id":"<<client_id>>","client_secret":"<<client_secret>>","audience":"https://cm-mori-sample/","grant_type":"client_credentials"}' >> {"access_token":"<<発行されたトークン>>","expires_in":86400,"token_type":"Bearer"}
認証が成功した時のログは以下のようになっています
この時点でサポートセンターのレポートを確認すると、利用数は0のままでしたが、実際にはカウントはされているはずです。
※ レポートは24時間ごとに更新される
実際に使い切ってみる
/oauth/token
へのリクエストは1秒あたり30リクエストの制限があるので、これに注意しながらループで回してみます。
for i in `seq 1 1000` do echo $i if [ $(( i % 10 )) -eq 0 ]; then sleep 5 fi curl ~~~~~~~ done
みたいな感じで10回ごとに5秒スリープして待つことにしました。
実行後
このコードを実行したところ、終了直後では1000回を超えてもトークンは発行されていました。 リミットがかかって拒否されるまでタイムラグがあるのかもしれません。
ログを検索したところ、Client Credentials Flowを使用したトークンの取得がきちんと記録されていました(1000件以上ある)
しばらくすると(大体4~5時間後)、Auth0から M2Mトークンのクオータの80%,90%使ってるよ
という内容のメールが届きました
80%が閾値になっていて、ユーザーにメールでお知らせしてくれるようになっているのでしょう。
この時点ではまだトークンが発行されてはいました.
次の日になってレポートを確認してみると、以下のように使い切っていることが確認できました。
トークンの取得はできる場合もあったんですが、ほぼエラーするようになっていきます。
{"error":"invalid_request","error_description":"M2M quota has been fully utilized for this calendar month"}
このようなエラーメッセージが返ってくるようになりました。
Auth0のダッシュボードのログ画面からも同じように確認できます。
上限を超えたその先は、エラーとなりトークンの取得ができなくなる です。 まあ予想通りではあります。
今回はエラーになるまでタイムラグがあったのですが、毎回あるとは限らないので、Client Credentials Flowでのトークン取得の上限を超えるとエラーとなる と知っておいて大丈夫かと思われます。
最後に
Client Credentials Flowを使った認証において、発行されたトークン数の上限を超えた時の挙動を確認してみました。
今回の実験では、使いきってすぐに制限がかかるわけではなかったのですが、最終的にはトークンの取得が行えなくなるので、 サービスの中断リスクを減らすためにAuth0でM2Mのアプリケーションを使用している場合は制限を気にしないといけません。
アプリケーション側でトークンの有効期限の間はキャッシュして再利用する、運用面ではClient Credentials Flowの成功ログをモニタリングする・レポートを確認する といったことをやっておく方が良さそうです。